www.gusucode.com > VC++ ASP文件上传组件源代码+调用示例-源码程序 > VC++ ASP文件上传组件源代码+调用示例-源码程序/code/aspup_src/MyRequest/ListItem.cpp
//Download by http://www.NewXing.com // ListItem.cpp : Implementation of CListItem #include "stdafx.h" #include "MyRequest.h" #include "ListItem.h" ///////////////////////////////////////////////////////////////////////////// // CListItem CListItem::CListItem() { } ///////////////////////////////////////////////////////////////////////////// // ISupportsErrorInfo interface implementation STDMETHODIMP CListItem::InterfaceSupportsErrorInfo(REFIID riid) { static const IID* arr[] = { &IID_IListItem }; for (int i=0; i < sizeof(arr) / sizeof(arr[0]); i++) { if (InlineIsEqualGUID(*arr[i],riid)) return S_OK; } return S_FALSE; } ///////////////////////////////////////////////////////////////////////////// // IListItem interface implementation STDMETHODIMP CListItem::get_Count(long* plCount) { if(plCount == NULL) return E_POINTER; *plCount = m_vecItems.size(); return S_OK; } STDMETHODIMP CListItem::get_Item(/*[in]*/ long lIndex, /*[out, retval]*/ IItem** ppItem) { if(lIndex < 1 || lIndex > m_vecItems.size()) return Error(_T("ListItem.Item()"), _T("index is out of range"), IID_IListItem, E_INVALIDARG); // ** Get the item CComObject<CItem>* pItem = m_vecItems[lIndex-1]; HRESULT hr = pItem->QueryInterface(IID_IItem, (void **)ppItem); if(FAILED(hr)) return E_UNEXPECTED; return S_OK; } STDMETHODIMP CListItem::get__NewEnum(IUnknown** ppUnk) { // return Error(_T("ListItem.NewEnum"), _T("Cannot create IEnumVARIANT"), IID_IListItem, 102); if(ppUnk == NULL) return E_POINTER; typedef CComEnum<IEnumVARIANT, &IID_IEnumVARIANT, VARIANT, _Copy<VARIANT> > ComVarEnum; typedef CComObject<ComVarEnum> VariantEnum; VariantEnum* pEnum = NULL; HRESULT hr = VariantEnum::CreateInstance(&pEnum); if(FAILED(hr)) return Error(_T("ListItem.NewEnum"), _T("Cannot create IEnumVARIANT"), IID_IListItem, 100); std::vector< CComVariant > vecItems; for(int i = 0; i < m_vecItems.size(); i++) { // ** Get the item CComObject<CItem>* pItem = m_vecItems[i]; IDispatch* pDispatch; pItem->QueryInterface(IID_IDispatch, (void **)&pDispatch); vecItems.push_back(CComVariant(pDispatch)); pDispatch->Release(); } hr = pEnum->Init(vecItems.begin(), vecItems.end(), 0, AtlFlagCopy); if(FAILED(hr)) return Error(_T("ListItem.NewEnum"), _T("Cannot create IEnumVARIANT"), IID_IListItem, 101); hr = pEnum->QueryInterface(IID_IEnumVARIANT, (void**) ppUnk); if(FAILED(hr)) return Error(_T("ListItem.NewEnum"), _T("Cannot create IEnumVARIANT"), IID_IListItem, 102); return S_OK; } STDMETHODIMP CListItem::get_Value(VARIANT* pValue) { CComBSTR bstrValue = _T(""); long lSize = m_vecItems.size(); for(long i = 0; i < lSize; i++) { CItem* pItem = m_vecItems[i]; if(pItem->isFile()) { bstrValue.AppendBSTR(pItem->GetFileName()); } else { CComVariant vValue = pItem->GetValue(); vValue.ChangeType(VT_BSTR); bstrValue.AppendBSTR(vValue.bstrVal); } if(i < lSize-1) { bstrValue.Append(_T(", ")); } } return CComVariant(bstrValue).Detach(pValue); } STDMETHODIMP CListItem::get_Name(BSTR* pName) { CComBSTR str = m_bstrName; *pName = str.Detach(); return S_OK; } HRESULT CListItem::AddItem(CComBSTR bstrFileName, CComBSTR bstrCType, CBuffer bContent, BOOL bFile) { CComObject<CItem>* pItem; CComObject<CItem>::CreateInstance(&pItem); if(bFile) { pItem->SetItem(bContent, bstrFileName, bstrCType); } else { pItem->SetItem(bContent); } m_vecItems.push_back(pItem); return S_OK; } void CListItem::SetName(CComBSTR bstrName) { m_bstrName = bstrName; } CComBSTR CListItem::GetName() { return m_bstrName; } void CListItem::FinalRelease() { m_vecItems.erase(m_vecItems.begin(), m_vecItems.end()); }